package main

import "fmt"

func main() {
	intChan := make(chan int)
	strChan := make(chan string)
	// 生产者1
	go func() {
		for i := 1; i <= 3; i++ {
			// 每次放入一个值到整型通道
			intChan <- i
		}
		close(intChan)
	}()
	// 生产者2
	go func() {
		for i := 1; i <= 3; i++ {
			// 字符串通道，必须放入字符串
			strChan <- fmt.Sprintf("消息%d", i)
		}
		close(strChan)
	}()
	// 消费者：直接从多个通道取出
	// 写一个循环就可以取出两个通道中的数据
	// 循环条件：两个通道不能为空
	for intChan != nil || strChan != nil {
		// 多路复用，监听多个通道是否有数据
		select {
		// num, ok 在多路复用使用
		case num, ok := <-intChan:
			if ok {
				fmt.Println(num)
			} else { // 如果去完值，赋值为空
				intChan = nil
			}

		case str, ok := <-strChan:
			if ok {
				fmt.Println(str)
			} else {
				strChan = nil
			}

		}
	}

}
